【卷积】2. 深度学习中的卷积进化史

卷积在深度学习中的应用

Convolutional neural networks therefore constitute a very useful tool for machine learning practitioners. However, learning to use CNNs for the first time is generally an intimidating experience.

CNN为什么work?

  • 局部连接代替全连接,& 权值共享
  • pooling层,

发展

  • 2012年, 基于深度学习CNN网络的AlexNet在ILSVRC竞赛的ImageNet上大放异彩
  • 检测: 2014年Ross Girshick利用CNN成功取代了HOG、DPM等特征提取, ross等人把目标检测分成了三个步骤,首先是对图像提取detection proposal,其实就是图像中一些可能是检测物体的区域,然后使用cnn对这些proposal进行特征提取,最后用svm对这些提取到的特征进行分类,从而完成检测的任务,这是 Two-stage object detectors鼻祖。

卷积的类型

简单卷积

卷积核为3、步幅为1和带有边界扩充的二维卷积结构

  • 卷积核大小(Kernel Size):定义了卷积操作的感受野。在二维卷积中,通常设置为3,即卷积核大小为3×3。
  • 步幅(Stride):定义了卷积核遍历图像时的步幅大小。其默认值通常设置为1,也可将步幅设置为2后对图像进行下采样,这种方式与最大池化类似。
  • 边界扩充(Padding):定义了网络层处理样本边界的方式。当卷积核大于1且不进行边界扩充,输出尺寸将相应缩小;当卷积核以标准方式进行边界扩充,则输出数据的空间尺寸将与输入相等。
  • 输入与输出通道(Channels):构建卷积层时需定义输入通道I,并由此确定输出通道O。这样,可算出每个网络层的参数量为I×O×K,其中K为卷积核的参数个数。例,某个网络层有64个大小为3×3的卷积核,则对应K值为 3×3 =9。

group conv

对channel 分group,然后各group独立,最后再合并。

关于group之间是否共享卷积核?以及影响?

实例

AlexNet中采用group conv的初衷是为了利用多GPU。为了减少GPU之间的交互带来的速度影响,只在特定的层才有共享权重

最小 卷积核

最小的卷积核,在1维卷积中是kernel size为1的卷积,二维卷积中是kernel size为1*1的卷积。

这种卷积又叫Pointwise convolution,即feature map上的每个point采用相同的卷积操作

作用

在channel上升维、降维。

1*1 卷积 (二维卷积)

针对[w,h,in_channel]的输入,进行 1,1二维卷积

$$
[w,h,in] \xrightarrow[1 \times 1 \times in \times out]{conv2d} [w,h,out]
$$

1*1卷积并未对图像尺寸进行调整,仅仅是channel之间的融合。

当$out_channel > in_channel$时,起到升维的作用;反之,则起到降维的作用。

1*1kernel广泛用于NIN、GoogLeNet、ResNet

注意

  • 缺陷: 1*1卷积并未考虑空间邻域的信息,仅仅是channel之间的整合。所以一般会配合
  • 优势: 计算量小,参数少

实战架构:

  1. 构造bottleneck架构:
    • 由于1*1卷积方便维度变换,很多网络构造bottleneck架构,即高维的IO,低维的middle,目的是在低维下进行复杂运算,减少计算量
    • 实例: NIN, GoogLeNet, ResNet
  2. 卷积的分解
    • 所有的depthwise seprable convolution

对应一维卷积,就是kernel_size 为1卷积

最大卷积核 - 全卷积

全卷积(FCN)

Transposed Convolutions

可分离卷积、分解卷积

Separable Convolution,Factorized Convolutions
应该是一个意思吧?

  • Separable
    • 即分离(split)的意思,将传统的一层conv分离为两层,一层用于filtering,一层用于combining

不可分离呢?

很自然我们会有两个疑问:为什么要分解?为什么能分解?

要解答这两个疑问,首先我们要搞清楚以下这件事情

卷积,就是局部的全连接,即矩阵乘法

[w,h,in] * [k,k,in,out]
这样的卷积,可以视为输入图像一个[k,k]局部的全连接。

conv([k,k,in], [k,k,in,out]) 等价于 [k*k*in] * [k*k*in*out]的一个全连接。就是个矩阵乘法。

k*k*in比较大时,仍然计算量很大。

如何减小计算量 - 矩阵分解

上面我们看到了,卷积就是局部的全连接。
那么一个最简单的减小计算量方式,就是矩阵分解(张量分解)。

[kkin] [kkinout]
我们需要对Tensor[in,k*k,out]进行分解,只需要保持[in,out]不变即可。
卷积核张量可以变成尺寸为$(whc) \times n)$的二维矩阵。
比如使用秩为$d$的SVD分解,因此每层的卷积核被分解成两个卷积核 $w \times h \times c \times d$ 和 $1 \times 1 \times d \times n$。这就是depthwise-conv + pointwise-conv吗?

回顾张量分解

1
2
3
[I,J,K] = [I,R] [J,R] [K,R] [R,R,R] # 最后一项可以省略,相当于降维到R,R要小于IJK。如果R较大,则是升维了。
= [I*J,R] [R,K] # 视为矩阵分解
= [I,R] [R,J*K] # 视为矩阵分解

张量分解,维度乱了,不再是conv形式了。既想矩阵分解,又想保持卷积形式,那么还是采用矩阵分解吧。

1
2
3
[in,k*k,out] = [in, k*k, R] [R, out]  # 维度不够,1来凑
= [in, k*k, R] [R, 1*1, out] #
# [depthwise] [pointwise]

通常情况下R怎么取值?既然是降低运算量,那么R的取值要小于in和out咯?

这里看到,这里的depthwise中,每个channel并不是independently,而是进行了R的交叉。

UV分解,USV分解。

为什么要分解?

要了解为什么要分解

为什么能分解?

深度可分离卷积

深度可分离卷积结构(depthwise separable convolution)

  • Depthwise
    • depth: channel数
    • depthwise: 顾名思义,就是对所有input channel采用相同的操作。channel之间的操作是独立的,不交互的。

DSC是分解卷积(factorized convolutions)的一种,它将常规的卷积分解为一个depthwise conv与一个1*1 conv

  • depthwise conv: 用于channel内的filtering
  • pointwise conv(1*1): 用于channel间的combining

定义:

DepthSepConv defines kxk depthwise convolution followed by 1x1 convolution

  • 因为depthwise卷积是channel间独立的,所以一般会后接1*1卷积,做channel间的融合

优势:

  • Depthwise separable convolutions reduce the number of parameters and computation used in convolutional operations while increasing representational efficiency.

传统卷积 (这里不关心$[w,h]$)
$$
[w, h,in] \xrightarrow[k \times k \times in \times out]{conv2d} [w,h,out]
$$

  • 卷积参数量: $k \times k \times in \times out$
  • 计算量:

参数

  • depth_multiplier:
    -

历史 & 应用

factorized convolutions是什么鬼?

  • Factorized Networks
  • Xception network
  • Squeezenet

为什么能降低参数量,同时还能保持精度?

类似矩阵分解的思想。

Group conv是一种channel分组的方式,Depthwise +Pointwise是卷积的方式,只是ShuffleNet里面把两者应用起来了。因此Group conv和Depthwise +Pointwise并不能划等号。

而group卷积只是单纯的通道分组处理,降低复杂度。

Dilated Convolutions

空洞卷积(atrous convolutions)又名扩张卷积(dilated convolutions),向卷积层引入了一个称为 “扩张率(dilation rate)”的新参数,该参数定义了卷积核处理数据时各值的间距。

一个扩张率为2的3×3卷积核,感受野与5×5的卷积核相同,而且仅需要9个参数。你可以把它想象成一个5×5的卷积核,每隔一行或一列删除一行或一列。

在相同的计算条件下,空洞卷积提供了更大的感受野。空洞卷积经常用在实时图像分割中。当网络层需要较大的感受野,但计算资源有限而无法提高卷积核数量或大小时,可以考虑空洞卷积。

扩展阅读

  1. Andrew Ng 的UFLDL教程
  2. 各种卷积结构原理及优劣 | Medium 比较新
  3. 一文了解各种卷积结构原理及优劣 | Medium & 中文翻译|知乎
  4. 理解深度学习中的卷积 | Tim Dettmers & 中文翻译 | 码农场
  5. Understanding Convolutions | colah
  6. 卷积为什么叫「卷」积? | 知乎
  7. 如何通俗易懂地解释卷积? | 知乎
  8. A guide to convolution arithmetic for deep learning